home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / PASCAL / ALLSWAGS.ZIP / SWAGG-M.ZIP / MISC.SWG / 0135_Yet more 32-Bit ASM Programming.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-05-26  |  2.4 KB  |  102 lines

  1.  
  2. { Updated MISC.SWG on May 26, 1995 }
  3.  
  4. {
  5. > I've seen a message where some guys were talking about 32 bits graphics
  6. > programming. It was something like this
  7. > db $66; MOVSW
  8. > When you use this it will move four bytes instead of 2. My problem is were
  9. > to put those 4 bytes which should be stord. I know the first 2 bytes should
  10. > be put in AX but were should you put the next 2. The trouble is that you
  11. > can't use EAX because it's a 386 instruction.
  12.  
  13. You are confused about MOVS and STOS/LODS
  14.  
  15.     { optional segment override, i.e. }
  16.     { SEGES }
  17.     MOVS(B|W|D)
  18. {
  19. copies 1,2 or 4 bytes pointed to by SegReg:SI to the memory location pointed to
  20. by ES:DI and in/decreases DI and SI accordingly. AL, AX, EAX are _not_
  21. involved.
  22. }
  23.     { optional segment override, i.e. }
  24.     { SEGES }
  25.     LODS(B|W|D)
  26. {
  27. loads 1,2 or four bytes pointed to by SegReg:SI to AL, AX, or EAX
  28. }
  29.     STOS(B|W|D)
  30. {
  31. stores 1,2 or 4 bytes from AL, AX, EAX to the location pointed to by ES:DI.
  32.  
  33. 386-only instructions and are not supported by BASM and you have to fake them
  34. using inline machine code.
  35. The usual technique is to use the WORD-oriented instructions and emit a
  36. }
  37.     db $66
  38. {
  39. before.
  40. }
  41.     db $66
  42.     MOV AX, BX
  43. {
  44. will be assembled to
  45. }
  46.     MOV EAX, EBX
  47. {
  48. If you have a longint variable declared by
  49. }
  50. var
  51.   l:longint;
  52. {
  53. you may load it to EAX by
  54. }
  55.     db $66
  56.     MOV AX, word ptr l
  57. {
  58. This does will be assembled to
  59. }
  60.     MOV EAX, dword ptr l
  61. {
  62. So there is no problem, if you want to load EAX from another 32-bit-register
  63. or from a memory location. The only problem may be to load eax with a
  64. constant or to transfer 16-bit register values to an extended register.
  65. Lets say you want to emulate a
  66. }
  67.     MOV  EAX, $ffff1234
  68. {
  69. The appropriate fake code is
  70. }
  71.     db $66
  72.     MOV AX, $1234    { low word }
  73.     dw $ffff         { high word }
  74. {
  75. for
  76. }
  77.     MOV EAX, 1
  78. {
  79. it is
  80. }
  81.     db $66
  82.     MOV AX,1
  83.     dw $0
  84.  
  85. {
  86. There is a general technique to copy a word register to the high word of an
  87. extended register.
  88. If you want to copy DX:AX to EBX (DX to the high word and AX to the low word of
  89. EBX) you may say
  90. }
  91.     MOV BX, DX      { DX to low word }
  92.     db $66          { shift it up by one word }
  93.     SHL BX, 16      { -> SHL EBX, 16 }
  94.     MOV BX, AX      { AX to low word }
  95. {
  96. another way would be
  97. }
  98.     PUSH DX
  99.     PUSH AX
  100.     db $66
  101.     POP  BX     { -> POPD EBX: pops _double_ word to EBX }
  102.